参考:javacv开发系列

新的用法(推荐)

为什么不需要安装opencv?

从javacv0.8开始,已经不需要本地安装opencv,直接通过引用opencv对应的系统平台的引用包即可

创建 Java 工程

添加maven依赖

1
2
3
4
5
6
7
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.4.0-1.5.4</version>
</dependency>

<!-- 注:可以从这里查看对应版本:http://bytedeco.org/download/ -->

测试环境

Main.java内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.liang.utils.opencv;

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.OpenCVFrameGrabber;

import javax.swing.*;

/**
* 调用windows平台的摄像头窗口视频
*
* @author 马亮南生
* @date 2020-11-20 15:39
*/
public class Main {

public static void main(String[] args) throws Exception, InterruptedException {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
// 开始获取摄像头数据
grabber.start();
// 新建一个窗口
CanvasFrame canvas = new CanvasFrame("摄像头");
canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
canvas.setSize(1000, 600);
canvas.setAlwaysOnTop(true);

while (true) {
// 窗口是否关闭
if (!canvas.isDisplayable()) {
// 停止抓取
grabber.stop();
// 退出
System.exit(2);
}
// 获取摄像头图像(frame是一帧视频图像)
Frame frame=grabber.grab();
// 将获取的图像放到窗口上显示
canvas.showImage(grabber.grab());

// 50毫秒刷新一次图像
Thread.sleep(50);
}
}
}

测试结果

旧的用法(不推荐)

安装 OpenCV-4.X

Windows

  1. 下载OpenCV OpenCV下载链接 选择maven支持的版本下载(最新版本可能还没有对应的jar包)

  2. 运行对应的.exe文件安装完成

  3. 安装完成后的目录

创建 Java 工程

添加maven依赖

1
2
3
4
5
6
7
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.4.0-1.5.4</version>
</dependency>

<!-- 注:可以从这里查看对应版本:http://bytedeco.org/download/ -->

测试环境

Main.java内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.liang.utils;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;

/**
* @author 马亮南生
* @date 2020-11-19 17:31
*/
public class Main {
static {
//必须要写
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.out.println("opencv\t" + Core.VERSION);
}

public static void main(String[] args) {
test();
}

public static void test() {
Mat src = Imgcodecs.imread("C:\\Users\\zjz\\Desktop\\head.jpg");
HighGui.imshow("哈妮", src);
HighGui.waitKey(1000);
}
}

修改 VM options

测试结果

参考

快速传送至:javacv入门指南:序章

javaCV系列文章:

javacv开发详解之1:调用本机摄像头视频

javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)

javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)

javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)

javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)

javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗,更好的性能,更低延迟)

补充篇:

音视频编解码问题:javaCV如何快速进行音频预处理和解复用编解码(基于javaCV-FFMPEG)

音视频编解码问题:16/24/32位位音频byte[]转换为小端序short[],int[],以byte[]转short[]为例

实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

java原生实现屏幕设备遍历和屏幕采集(捕获)等功能

javacpp-ffmpeg系列:

javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据

javacpp-FFmpeg系列之3: 图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转)

javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题

javacpp-opencv系列:

一、javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

二、javaCV图像处理之2:实时视频添加图片水印,实现不同大小图片叠加,图像透明度控制

三、javacv图像处理3:使用opencv原生方法遍历摄像头设备及调用(方便多摄像头遍历及调用,相比javacv更快的摄像头读取速度和效率,方便读取后的图像处理)

四、javacv图像处理系列:国内车辆牌照检测识别系统(万份测试准确率99.7%以上)